class Solution {
public:
//ans:维护父节点和1/2条边的最长路径
//maxlen:维护的是最长的一条边
//无论是二叉树还是多叉树,最长路径是由一个节点和2条或者1条边组成的
vector<vector<int>>mp;
int ans=0;
int dfs(string& s,int fu)
{
    int maxlen=0;
    for(int i : mp[fu])
    {
        int len=dfs(s,i)+1;
        if(s[fu]!=s[i])
        {
            ans = max(ans, maxlen + len);//统计1条/2条边的最大值
            maxlen = max(maxlen, len);//维护同一个父节点的最长的一条边
        }
    }
    return maxlen;
}
    int longestPath(vector<int>& parent, string s) {
        int n=parent.size();
        mp.resize(n);
        for(int i=1;i<n;i++)
            mp[parent[i]].push_back(i);
        dfs(s,0);
        return ans+1;
    }
};